2.2: Daur Hidup Aktivitas dan Mengelola Keadaan

Materi:

Dalam bab ini, Anda akan mempelajari tentang daur hidup aktivitas, kejadian callback yang bisa Anda implementasikan untuk melakukan tugas di setiap tahap daur hidup, dan cara menangani keadaan instance aktivitas di seluruh daur hidup aktivitas.

Tentang daur hidup aktivitas

Daur hidup aktivitas adalah serangkaian keadaan aktivitas yang terjadi selama masa pakai keseluruhan, dari pertama kali dibuat hingga ketika dimusnahkan dan sistem mengklaim kembali sumber daya aktivitas tersebut. Karena pengguna berinteraksi dengan aplikasi Anda dan aplikasi lain pada perangkat, aktivitas yang berbeda akan beralih ke keadaan yang berbeda.

Misalnya, bila Anda memulai aplikasi, aktivitas utama aplikasi (Aktivitas 1) akan dimulai, muncul ke latar depan, dan menerima fokus pengguna. Bila Anda memulai aktivitas kedua (Aktivitas 2), aktivitas baru tersebut juga akan dibuat dan dimulai, dan aktivitas utama akan dihentikan. Bila Anda selesai dengan aktivitas kedua dan mengarah kembali, aktivitas utama akan dilanjutkan. Aktivitas kedua berhenti dan tidak lagi diperlukan; jika pengguna tidak melanjutkan aktivitas kedua, aktivitas akhirnya akan dimusnahkan oleh sistem. Daur Hidup Aktivitas

Keadaan aktivitas dan metode callback daur hidup

Bila aktivitas bertransisi masuk dan keluar dari keadaan daur hidup berbeda saat berjalan, sistem Android akan memanggil sejumlah metode callback daur hidup pada setiap tahap. Semua metode callback adalah kaitan yang bisa Anda ganti di setiap kelas Activity untuk mendefinisikan perilaku aktivitas bila pengguna meninggalkan dan memasuki aktivitas kembali. Perlu diingat bahwa keadaan daur hidup (dan callback) adalah per aktivitas, bukan per aplikasi, dan Anda bisa mengimplementasikan perilaku berbeda di titik yang berbeda dalam daur hidup aktivitas yang berbeda di aplikasi.

Gambar ini menampilkan setiap keadaan aktivitas dan metode callback yang terjadi saat transisi aktivitas di antara keadaan yang berbeda: Diagram Daur Hidup Aplikasi

Bergantung pada kompleksitas aktivitas, mungkin tidak semua metode callback daur hidup diimplementasikan di aktivitas. Akan tetapi, Anda perlu memahami satu per satu dan mengimplementasikan metode tersebut untuk memastikan aplikasi berperilaku seperti harapan pengguna. Mengelola daur hidup aktivitas Anda dengan mengimplementasikan metode callback sangat penting untuk mengembangkan aplikasi yang kuat dan fleksibel.

Aktivitas Dibuat (metode onCreate())

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // The activity is being created.
}

Aktivitas Anda masuk ke keadaan yang dibuat bila dimulai untuk pertama kali. Bila aktivitas dibuat pertama kali, sistem akan memanggil metode onCreate() untuk melakukan inisialisasi aktivitas itu. Misalnya, bila pengguna mengetuk ikon aplikasi dari layar utama atau beranda untuk memulai aplikasi itu, sistem akan memanggil metode onCreate() untuk aktivitas dalam aplikasi yang Anda deklarasikan sebagai aktivitas "peluncur" atau "utama". Dalam hal ini metode onCreate() aktivitas utama analog dengan metode main() di program lainnya.

Demikian juga, jika aplikasi Anda memulai aktivitas lain dengan maksud (baik eksplisit maupun implisit), sistem akan mencocokkan permintaan maksud dengan aktivitas dan memanggil onCreate() untuk aktivitas baru itu.

Metode onCreate() adalah satu-satunya callback yang harus Anda implementasikan di kelas aktivitas. Di metode onCreate(), Anda menjalankan logika startup aplikasi dasar yang hanya boleh terjadi sekali, seperti mempersiapkan antarmuka pengguna, menetapkan variabel-variabel cakupan kelas, atau mempersiapkan tugas latar belakang.

Dibuat adalah keadaan sementara; aktivitas tetap berada dalam keadaan dibuat hanya selama dibutuhkan untuk menjalankan onCreate(), kemudian aktivitas beralih ke keadaan dimulai.

Aktivitas Dimulai (metode onStart())

@Override
protected void onStart() {
    super.onStart();
    // The activity is about to become visible.
}

Setelah aktivitas Anda diinisialisasi dengan onCreate(), sistem akan memanggil metode onStart(), dan aktivitas berada dalam keadaan dimulai. Metode onStart() juga dipanggil jika aktivitas yang dihentikan kembali ke latar depan, seperti bila pengguna mengeklik tombol kembali atau naik untuk mengarah ke layar sebelumnya. Meskipun OnCreate() hanya dipanggil sekali bila aktivitas dibuat, metode onStart() bisa digunakan berkali-kali selama daur hidup aktivitas saat pengguna menyusuri aplikasi Anda.

Bila aktivitas berada dalam keadaan dimulai dan terlihat di layar, pengguna tidak bisa berinteraksi dengan aktivitas tersebut hingga onResume() dipanggil, aktivitas berjalan, dan aktivitas berada di latar depan.

Biasanya Anda mengimplementasikan onStart() di aktivitas sebagai pasangan untuk metode OnStop(). Misalnya, jika Anda melepas sumber daya perangkat keras (seperti GPS atau sensor) bila aktivitas dihentikan, Anda bisa mendaftarkan ulang sumber daya tersebut di metode onStart().

Dimulai, seperti halnya dibuat, adalah keadaan sementara. Setelah memulai, aktivitas berpindah ke keadaan dilanjutkan (berjalan).

Aktivitas dilanjutkan/berjalan (metode onResume())

@Override
protected void onResume() {
    super.onResume();
    // The activity has become visible (it is now "resumed").
}

Aktivitas Anda berada dalam keadaan dilanjutkan saat diinisialisasi, terlihat pada layar, dan siap digunakan. Keadaan dilanjutkan biasanya disebut keadaan berjalan, karena dalam keadaan ini pengguna benar-benar berinteraksi dengan aplikasi Anda.

Saat pertama aktivitas dimulai, sistem akan memanggil metode onResume() persis setelah onStart(). Metode onResume() juga mungkin dipanggil beberapa kali, setiap kali aplikasi kembali dari keadaan dihentikan sementara.

Sebagaimana dengan metode onStart() dan OnStop(), yang diimplementasikan berpasangan, Anda biasanya hanya mengimplementasikan onResume() sebagai pasangan untuk onPause(). Misalnya, jika dalam metode onPause() Anda menghentikan setiap animasi pada layar, Anda akan memulai lagi animasi tersebut di onResume().

Aktivitas ini tetap berada dalam keadaan dilanjutkan selama aktivitas berada di latar depan dan pengguna berinteraksi dengannya. Dari keadaan dilanjutkan, aktivitas bisa beralih ke keadaan dihentikan sementara.

Aktivitas dihentikan sementara (metode onPause())

@Override
protected void onPause() {
    super.onPause();
    // Another activity is taking focus
    // (this activity is about to be "paused").
}

Keadaan dihentikan sementara bisa terjadi dalam sejumlah situasi:

  • Aktivitas akan masuk ke latar belakang, namun belum sepenuhnya berhenti. Ini merupakan indikasi pertama bahwa pengguna meninggalkan aktivitas Anda.
  • Aktivitas hanya terlihat sebagian di layar, karena dialog atau aktivitas transparan lainnya dihamparkan di atasnya.
  • Dalam mode multi-jendela atau layar terpisah (API 24), aktivitas ini ditampilkan pada layar, namun beberapa aktivitas lain memiliki fokus pengguna.

Sistem memanggil metode onPause() bila aktivitas beralih ke keadaan dihentikan sementara. Karena metode onPause() adalah indikasi pertama yang didapat bahwa pengguna mungkin meninggalkan aktivitas, Anda bisa menggunakan onPause() untuk menghentikan pemutaran animasi atau video, melepas sumber daya yang mengandalkan perangkat keras, atau mengikat perubahan aktivitas yang belum disimpan (seperti draf email).

Metode onPause() akan segera dijalankan. Jangan menggunakan onPause() untuk operasi yang banyak menggunakan CPU seperti menulis data persisten ke database. Aplikasi mungkin masih terlihat di layar saat diteruskan ke keadaan dihentikan sementara, dan penundaan apa pun dalam eksekusi onPause() bisa memperlambat transisi pengguna ke aktivitas berikutnya. Implementasikan operasi beban-berat bila aplikasi berada dalam keadaan dihentikan.

Perhatikan, dalam mode multi-jendela (API 24), aktivitas yang dihentikan sementara masih bisa terlihat pada layar. Dalam hal ini, Anda tidak perlu menghentikan sementara pemutaran animasi atau video seperti yang diinginkan untuk aktivitas yang terlihat sebagian. Anda bisa menggunakan metode inMultiWindowMode() di kelas Activity untuk menguji apakah aplikasi sedang berjalan dalam mode multi-jendela.

Aktivitas Anda bisa berpindah dari keadaan dihentikan sementara ke keadaan dilanjutkan (jika pengguna kembali ke aktivitas tersebut) atau ke keadaan dihentikan (jika pengguna meninggalkan aktivitas secara bersamaan).

Aktivitas dihentikan (metode onStop())

@Override
protected void onStop() {
    super.onStop();
    // The activity is no longer visible (it is now "stopped")
}

Aktivitas berada dalam keadaan dihentikan bila tidak lagi terlihat pada layar. Hal ini biasanya karena pengguna memulai aktivitas lain, atau kembali ke layar utama. Sistem mempertahankan instance aktivitas di back-stack, dan jika pengguna kembali ke aktivitas tersebut, maka akan dimulai lagi. Aktivitas yang dihentikan mungkin dimatikan secara bersamaan oleh sistem Android jika sumber daya minim.

Sistem akan memanggil metode onStop() bila aktivitas berhenti. Implementasikan metode OnStop() untuk menyimpan data persisten dan melepas sisa sumber daya yang belum dirilis di onPause(), termasuk operasi yang mungkin terlalu berat untuk onPause().

Aktivitas dimusnahkan (metode onDestroy())

@Override
protected void onDestroy() {
    super.onDestroy();
    // The activity is about to be destroyed.
}

Bila dimusnahkan, aktivitas akan dimatikan sepenuhnya, dan instance Aktivitas diklaim ulang oleh sistem. Hal ini bisa terjadi dalam sejumlah kasus:

  • Anda memanggil finish() di aktivitas untuk mematikannya secara manual.
  • Pengguna kembali ke aktivitas sebelumnya.
  • Perangkat dalam situasi minim memori sehingga sistem mengklaim kembali aktivitas yang dihentikan untuk membebaskan lebih banyak sumber daya.
  • Terjadi perubahan konfigurasi perangkat. Anda akan mengetahui selengkapnya tentang perubahan konfigurasi nanti dalam bab ini.

Gunakan onDestroy() untuk menghapus sepenuhnya setelah aktivitas Anda sehingga tidak ada komponen (seperti thread) yang berjalan setelah aktivitas ini dimusnahkan.

Perhatikan, ada kalanya sistem akan benar-benar mematikan proses hosting aktivitas tanpa memanggil metode ini (atau metode lainnya), sehingga Anda tidak boleh mengandalkan onDestroy() untuk menyimpan data atau keadaan aktivitas yang diperlukan. Sebagai gantinya, gunakan onPause() atau onStop().

Aktivitas dimulai kembali (metode onRestart())

@Override
protected void onRestart() {
    super.onRestart();
    // The activity is about to be restarted.
}

Keadaan dimulai kembali adalah keadaan sementara yang hanya terjadi jika aktivitas yang dihentikan dimulai kembali. Jika metode onRestart() dipanggil di antara onStop() dan onStart(). Jika memiliki sumber daya yang perlu dihentikan atau dimulai, Anda biasanya mengimplementasikan perilaku tersebut di OnStop() atau onStart(), bukan onRestart().

Perubahan konfigurasi dan keadaan aktivitas

Sebelumnya di bagian onDestroy() Anda telah mengetahui bahwa aktivitas mungkin dimusnahkan bila pengguna mengarah kembali, oleh Anda dengan metode finish(), atau oleh sistem bila perlu membebaskan sumber daya. Aktivitas Anda dimusnahkan keempat kalinya bila perangkat mengalami perubahan konfigurasi.

Perubahan konfigurasi terjadi di perangkat, dalam waktu proses, dan membatalkan validasi layout saat ini atau sumber daya lainnya di aktivitas Anda Bentuk yang paling umum dari perubahan konfigurasi adalah bila perangkat diputar. Bila perangkat diputar dari potret ke lanskap, atau sebaliknya, layout aplikasi Anda juga perlu diubah. Sistem membuat ulang aktivitas untuk membantu aktivitas tersebut beradaptasi dengan konfigurasi baru dengan memuat sumber daya alternatif (seperti layout khusus lanskap).

Perubahan konfigurasi lainnya bisa meliputi perubahan di lokal (pengguna memilih bahasa sistem yang berbeda), atau pengguna masuk ke mode multi-jendela (Android 7). Dalam mode multi-jendela, jika Anda telah mengonfigurasi aplikasi agar bisa diubah ukurannya, Android akan membuat ulang aktivitas tersebut untuk menggunakan definisi layout bagi ukuran aktivitas baru yang lebih kecil.

Bila terjadi perubahan konfigurasi, sistem Android akan menutup aktivitas Anda (memanggil onPause(), OnStop(), dan onDestroy()), kemudian memulainya dari awal (memanggil onCreate(), onStart(), dan onResume()).

Keadaan instance aktivitas

Bila aktivitas dimusnahkan dan dibuat ulang, ada implikasi untuk keadaan waktu proses aktivitas itu. Bila aktivitas dihentikan sementara atau dihentikan sepenuhnya, keadaan aktivitas akan dipertahankan karena aktivitas tersebut masih ditahan dalam memori. Bila aktivitas dibuat ulang, keadaan aktivitas dan kemajuan pengguna di aktivitas tersebut akan hilang, dengan pengecualian ini:

  • Sebagian informasi keadaan aktivitas secara otomatis disimpan secara default. Keadaan tampilan di layout Anda dengan ID unik (seperti yang didefinisikan oleh atribut android:id di layout) disimpan dan dipulihkan bila aktivitas dibuat ulang. Dalam hal ini, nilai-nilai yang dimasukkan pengguna di tampilan EditText biasanya dipertahankan bila aktivitas tersebut dibuat ulang.
  • Maksud yang digunakan untuk memulai aktivitas, dan informasi yang tersimpan di data atau ekstra maksud, tetap tersedia untuk aktivitas itu bila dibuat ulang.

Keadaan aktivitas disimpan sebagai rangkaian pasangan kunci/nilai di objek Bundle yang disebut keadaan instance aktivitas. Sistem akan menyimpan informasi keadaan default ke bundel keadaan instance tepat sebelum aktivitas dihentikan, dan meneruskan bundel itu ke instance aktivitas baru untuk dipulihkan.

Anda bisa menambahkan data instance sendiri ke bundel keadaan instance dengan mengganti callback onSaveInstanceState(). Bundel keadaan diteruskan ke metode onCreate(), sehingga Anda bisa memulihkan data keadaan instance tersebut bila aktivitas dibuat. Ada juga callback onRestoreInstanceState() yang bisa Anda gunakan untuk memulihkan data keadaan.

Karena rotasi perangkat adalah kasus penggunaan umum untuk aplikasi, pastikan Anda menguji bahwa aktivitas berperilaku dengan benar sebagai respons terhadap perubahan konfigurasi ini, dan implementasikan instance keadaan jika diperlukan.

Catatan:Keadaan instance aktivitas bersifat khusus untuk intance aktivitas tertentu, yang berjalan di satu tugas. Jika pengguna menghentikan aplikasi secara paksa, maka boot ulang perangkat, atau jika sistem Android menutup seluruh proses aplikasi untuk menjaga memori, keadaan instance aktivitas akan hilang. Untuk mempertahankan perubahan keadaan di seluruh instance aplikasi dan mem-boot ulang perangkat, Anda perlu menulis data itu ke preferensi bersama. Anda akan mengetahui selengkapnya tentang preferensi bersama dalam bab berikutnya.

Menyimpan keadaan instance aktivitas

Untuk menyimpan informasi ke bundel keadaan instance, gunakan callback onSaveInstanceState(). Ini bukan metode callback daur hidup, namun metode ini dipanggil bila pengguna meninggalkan aktivitas Anda (kadang-kadang sebelum metode OnStop()).

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    // save your state data to the instance state bundle
}

Di metode onSaveInstanceState() diteruskan objek Bundle (kumpulan pasangan kunci/nilai) bila dipanggil. Ini adalah bundel keadaan instance yang nanti Anda tambahkan informasi keadaan aktivitas sendiri.

Anda telah mempelajari tentang berbagai bundel di bab sebelumnya saat menambahkan kunci dan nilai untuk ekstra maksud. Tambahkan informasi ke bundel keadaan instance dengan cara yang sama, dengan kunci yang Anda definisikan dan beragam metode "put" yang didefinisikan dalam kelas Bundle:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);

    // Save the user's current game state
    savedInstanceState.putInt("score", mCurrentScore);
    savedInstanceState.putInt("level", mCurrentLevel);
}

Jangan lupa memanggil melalui kelas super, untuk memastikan keadaan hierarki tampilan juga disimpan ke bundel.

Memulihkan keadaan instance aktivitas

Setelah menyimpan keadaan instance aktivitas, Anda juga perlu memulihkannya bila aktivitas tersebut dibuat ulang. Anda bisa melakukannya di salah satu dari dua tempat:

  • Metode callback onCreate(), yang dipanggil bersama bundel keadaan instance bila aktivitas dibuat.
  • Callback onRestoreInstanceState(), yang dipanggil setelah onStart(), setelah aktivitas dibuat.

Sering kali, tempat yang lebih baik untuk memulihkan keadaan aktivitas adalah di onCreate(), untuk memastikan antarmuka pengguna Anda yang menyertakan keadaan tersedia sesegera mungkin.

Untuk memulihkan keadaan instance yang disimpan di onCreate(), uji keberadaan bundel keadaan sebelum Anda mencoba mendapatkan datanya. Bila aktivitas Anda dimulai untuk pertama kali, keadaan tidak akan ada dan bundel akan nol.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt("score");
        mCurrentLevel = savedInstanceState.getInt("level");
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

Praktik Terkait

Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.

Ketahui Selengkapnya

results matching ""

    No results matching ""